package fix;

import objects.CarBase;
import objects.CarNodeStore;
import objects.LinkNode;

import java.util.List;

/**
 * @author web
 * 该方法用于修复路径，当路径的最小信息素到达阈值10%，即启动重建策略
 * 重建策略简单来说就是将即将断开的节点选择身边的可连接车辆计算(除已参与路径的，因为双向链表已经知道前一个和后一个的车辆了，所以就不需要已参与的车辆做候选)
 */
public class FixLink {
    public static void fix(LinkNode cur, CarNodeStore carNodeStore) {
        List<CarBase> list = carNodeStore.getCarList();
        double[][] probability = carNodeStore.getProbability();
        double[][] ability = carNodeStore.getAbility();
        List<Integer> linkIndex = carNodeStore.getLinkIndex();
        double max = 0;
        double ab = 0;
        int flag = 0;
        CarBase carBase = null;
        //从当前节点开始循环
        for (int i = cur.getIndex(); i < list.size(); i++) {
            //找到某辆可以连接到当前cur车的备选车辆。
            if (probability[cur.getIndex()][i] > 0) {
                //循环整个链路索引表，找这辆车是不是已经参与了构建链路
                for (int j = 0; j < linkIndex.size(); j++) {
                    //若没有参与就找最大的那个车替换掉cur。
                    if (linkIndex.get(j) != i) {
                        if (probability[cur.getIndex()][i] >= max) {
                            max = probability[cur.getIndex()][i];
                            ab = ability[cur.getIndex()][i];
                            carBase = list.get(i);
                            flag = i;
                        }
                    }
                }
            }
        }
        LinkNode node = new LinkNode(flag, carBase, ab, cur.getPre(), cur.getNext());
        cur.getPre().setNext(node);
        cur.getNext().setPre(node);
    }
}
